package com.atguigu.java;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 *  集合元素的遍历操作，使用迭代器Iterator接口
 *      1.内部的方法：hasNext() 和 next()
 *      2.集合对象每次调用iterator()方法都得到一个全新的迭代器对象，默认游标都在集合的第一个元素之前。
 *      3.内部定义了remove()方法，可以在遍历的时候，删除集合中的元素。此方法不同于集合直接调用remove()
 * @author : leimingchao
 * @date Date : 2021年10月05日 22:25
 */
public class IteratorTest {

    @Test
    public void test1() {

        Collection collection = new ArrayList();
        collection.add(123);
        collection.add(456);
        collection.add(new Person("Jerry", 20));
        collection.add(new String("Tom"));
        collection.add(false);

        Iterator iterator = collection.iterator();
        //方式一：
        // System.out.println(iterator.next());
        // System.out.println(iterator.next());
        // System.out.println(iterator.next());
        // System.out.println(iterator.next());
        // System.out.println(iterator.next());
        //报异常：NoSuchElementException
        // System.out.println(iterator.next());

        //方式二：不推荐
        // for (int i = 0; i < collection.size(); i++) {
        //     System.out.println(iterator.next());
        // }
        //方式三：推荐
        //hasNext():判断是否还有下一个元素
        while (iterator.hasNext()) {
            //next():①指针下移 ②将下移以后集合位置上的元素返回
            System.out.println(iterator.next());
        }
    }

    @Test
    public void test2() {
        Collection collection = new ArrayList();
        collection.add(123);
        collection.add(456);
        collection.add(new Person("Jerry", 20));
        collection.add(new String("Tom"));
        collection.add(false);

        //错误方式一：
        // Iterator iterator = collection.iterator();
        // while (iterator.next() != null) {
        //     System.out.println(iterator.next());
        // }

        //错误方式二：集合对象每次调用iterator()方法都得到一个全新的迭代器对象，默认游标都在集合
        // 的第一个元素之前。
        while (collection.iterator().hasNext()) {
            System.out.println(collection.iterator().next());
        }
    }

    /**
     * 测试Iterator中的remove()
     *     如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法，再调用remove都会报IllegalStateException。
     */
    @Test
    public void test3() {
        Collection collection = new ArrayList();
        collection.add(123);
        collection.add(456);
        collection.add(new Person("Jerry", 20));
        collection.add(new String("Tom"));
        collection.add(false);

        //删除集合中Tom这个数据
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
            // iterator.remove();
            Object object = iterator.next();
            if ("Tom".equals(object)) {
                iterator.remove();
                // iterator.remove();
            }
        }
        //遍历集合
        Iterator iterator1 = collection.iterator();
        while (iterator1.hasNext()) {
            System.out.println(iterator1.next());
        }

    }
}
